// system.go
package main

import (
	pbc "github.com/Nik-U/pbc"
)

// SystemParams 包含了协议的所有公共参数 (双线性对版本)
type SystemParams struct {
	Pairing *pbc.Pairing
	G       *pbc.Element // G1的生成元
	U       *pbc.Element // G1中的一个随机元素
}

// SecretKey 数据所有者的私钥
type SecretKey struct {
	Gamma *pbc.Element // 私钥 γ (在 Z_p 域)
}

// PublicKey 数据所有者的公钥
type PublicKey struct {
	G_gamma *pbc.Element // 公钥 g^γ (在 G1 群)
}

// AuditChallenge 封装了审计挑战所需的信息
type AuditChallenge struct {
	FileID  string
	Indices []int
	Weights []*pbc.Element // 挑战权重 e_l (在 Z_p 域)
}

// PartialProof CSP生成的本地部分证明 Γ_k = (α_k, β_k)
type PartialProof struct {
	Alpha *pbc.Element // 数据聚合值 α_k (在 Z_p 域)
	Beta  *pbc.Element // 标签聚合值 β_k (在 G1 群)
}

// FinalProof 聚合所有部分证明后的最终证明 Γ = (α, β)
type FinalProof struct {
	Alpha *pbc.Element // 最终数据聚合值 α (在 Z_p 域)
	Beta  *pbc.Element // 最终标签聚合值 β (在 G1 群)
}

// NewSystemParams 初始化系统参数
func NewSystemParams() (*SystemParams, error) { // 注意：这里不再需要 cspIDs 作为输入
	// 使用 Type A pairing，安全级别约等于1024-bit RSA
	params := pbc.GenerateA(160, 512)
	pairing := params.NewPairing()

	g := pairing.NewG1().Rand()
	u := pairing.NewG1().Rand()

	return &SystemParams{
		Pairing: pairing,
		G:       g,
		U:       u,
	}, nil
}

// h 是协议中的哈希函数: {0,1}* -> G1
func (sp *SystemParams) h(input string) *pbc.Element {
	return sp.Pairing.NewG1().SetFromHash([]byte(input))
}
